using System.Collections.Generic;
using Microsoft.Practices.ServiceLocation;
using SIP.PN.Filtros.Interfaces;
using SIP.PN.Modelo.Entidades;
using SIP.PN.Servicios.Interfaces;
using SIP.PN.Servicios.Interfaces.DTO;

namespace SIP.PN.Servicios
{
    public abstract class Servicio : IServicio
    {
        #region Mapper

        #region Entidades Comunes

        public EspecialidadDTO ConvertToDTO(Especialidad entidad)
        {
            if (entidad == null)
                return null;

            EspecialidadDTO dto = new EspecialidadDTO();
            dto.Codigo = entidad.Codigo;
            dto.Nombre = entidad.Nombre;
            dto.Descripcion = entidad.Descripcion;

            return dto;
        }

        public TipoDeDocumentoDTO ConvertToDTO(TipoDeDocumento entidad)
        {
            if (entidad == null)
                return null;

            TipoDeDocumentoDTO dto = new TipoDeDocumentoDTO();
            dto.Codigo = entidad.Codigo;
            dto.Nombre = entidad.Nombre;

            return dto;
        }

        public NivelEspecialidadDTO ConvertToDTO(NivelEspecialidad entidad)
        {
            if (entidad == null)
                return null;

            NivelEspecialidadDTO dto = new NivelEspecialidadDTO();
            dto.Codigo = entidad.Codigo;
            dto.Nombre = entidad.Nombre;

            return dto;
        }

        public ProyectoEstadoDTO ConvertToDTO(ProyectoEstado entidad)
        {
            if (entidad == null)
                return null;

            ProyectoEstadoDTO dto = new ProyectoEstadoDTO();
            dto.Codigo = entidad.Codigo;
            dto.Nombre = entidad.Nombre;

            return dto;
        }

        public ProyectoTareaEstadoDTO ConvertToDTO(ProyectoTareaEstado entidad)
        {
            if (entidad == null)
                return null;

            ProyectoTareaEstadoDTO dto = new ProyectoTareaEstadoDTO();
            dto.Codigo = entidad.Codigo;
            dto.Nombre = entidad.Nombre;
            dto.PuedeEditar = entidad.PuedeEditar();
            dto.PuedeEditarAsignacion = entidad.PuedeEditarAsignacion();
            dto.PuedeEditarRequisito = entidad.PuedeEditarRequisito();
            dto.PuedeEliminar = entidad.PuedeEliminar();
            dto.PuedeEvaluar = entidad.PuedeEvaluar();
            dto.EsCancelada = entidad.EsCancelada();
            dto.EsFinalizada = entidad.EsFinalizada();
            dto.EsIniciada = entidad.EsIniciada();
            dto.EsPendiente = entidad.EsPendiente();

            return dto;
        }

        public TallerDTO ConvertToDTO(Taller entidad)
        {
            if (entidad == null)
                return null;

            TallerDTO dto = new TallerDTO();
            dto.Codigo = entidad.Codigo;
            dto.Nombre = entidad.Nombre;
            dto.Descripcion = entidad.Descripcion;
            dto.Especialidad = ConvertToDTO(entidad.Especialidad);

            return dto;
        }

        #endregion

        #region Tarea

        public TareaDTO ConvertToDTO(Tarea entidad)
        {
            if (entidad == null)
                return null;

            TareaDTO dto = new TareaDTO();
            dto.Codigo = entidad.Codigo;
            dto.Nombre = entidad.Nombre;
            dto.Descripcion = entidad.Descripcion;
            dto.Especialidad = ConvertToDTO(entidad.Especialidad);

            return dto;
        }

        #endregion

        #region Tipo de Proyecto

        public ConceptoDTO ConvertToDTO(Concepto entidad)
        {
            if (entidad == null)
                return null;

            ConceptoDTO dto = new ConceptoDTO();
            dto.Codigo = entidad.Codigo;
            dto.Nombre = entidad.Nombre;
            dto.Descripcion = entidad.Descripcion;
            dto.Tipo = entidad.Tipo;

            return dto;
        }

        public TipoDeProyectoDTO ConvertToDTO(TipoDeProyecto entidad)
        {
            if (entidad == null)
                return null;

            TipoDeProyectoDTO dto = new TipoDeProyectoDTO();
            dto.Codigo = entidad.Codigo;
            dto.Nombre = entidad.Nombre;
            dto.Conceptos = new List<ConceptoDTO>();
            foreach (Concepto concepto in entidad.Conceptos)
            {
                dto.Conceptos.Add(ConvertToDTO(concepto));
            }

            return dto;
        }

        #endregion

        #region Operario

        public OperarioDTO ConvertToDTO(Operario entidad)
        {
            if (entidad == null)
                return null;

            OperarioDTO dto = new OperarioDTO();
            dto.TipoDeDocumento = ConvertToDTO(entidad.TipoDeDocumento);
            dto.NumeroDocumento = entidad.NumeroDocumento;
            dto.Apellido = entidad.Apellido;
            dto.Nombre = entidad.Nombre;
            dto.FechaNacimiento = entidad.FechaNacimiento;
            dto.Activo = entidad.Activo;
            dto.Telefono = entidad.Telefono;
            dto.Celular = entidad.Celular;
            dto.Localidad = entidad.Localidad;
            dto.Direccion = entidad.Direccion;
            return dto;
        }

        public OperarioEspecialidadDTO ConvertToDTO(OperarioEspecialidad entidad)
        {
            if (entidad == null)
                return null;

            OperarioEspecialidadDTO dto = new OperarioEspecialidadDTO();
            dto.CodigoEspecialidad = entidad.Especialidad.Codigo;
            dto.CodigoNivelEspecialidad = entidad.NivelEspecialidad.Codigo;
            dto.CodigoOperario = entidad.Operario.ToString();
            dto.Apellido = entidad.Operario.Apellido;
            dto.Nombre = entidad.Operario.Nombre;
            dto.Especialidad = entidad.Especialidad.Nombre;
            dto.NivelEspecialidad = entidad.NivelEspecialidad.Nombre;
            dto.Activo = entidad.Activo;
            dto.Puntaje = entidad.Operario.CalcularEspecialidadPuntaje(entidad);
            return dto;
        }

        #endregion

        #region Proyecto

        public ProyectoDTO ConvertToDTO(Proyecto entidad)
        {
            if (entidad == null)
                return null;

            ProyectoDTO dto = new ProyectoDTO();
            dto.Codigo = entidad.Codigo;
            dto.Nombre = entidad.Nombre;
            dto.Descripcion = entidad.Descripcion;
            dto.TipoDeProyecto = ConvertToDTO(entidad.TipoDeProyecto);
            dto.Estado = ConvertToDTO(entidad.Estado);
            dto.Cliente = entidad.Cliente;
            dto.FechaInicio = entidad.FechaInicio;
            dto.FechaFin = entidad.FechaFin;

            return dto;
        }

        public ProyectoTrabajoDTO ConvertToDTO(ProyectoTrabajo entidad)
        {
            if (entidad == null)
                return null;

            ProyectoTrabajoDTO dto = new ProyectoTrabajoDTO();
            dto.Codigo = entidad.Codigo;
            dto.Nombre = entidad.Nombre;
            dto.Descripcion = entidad.Descripcion;
            dto.Orden = entidad.Orden;
            dto.Estado = ConvertToDTO(entidad.Estado);
            dto.FechaSolicitud = entidad.FechaSolicitud;
            dto.CodigoProyecto = entidad.Proyecto.Codigo;

            return dto;
        }

        public ProyectoTareaDTO ConvertToDTO(ProyectoTarea entidad)
        {
            if (entidad == null)
                return null;

            ProyectoTareaDTO dto = new ProyectoTareaDTO();
            dto.Codigo = entidad.Codigo;
            dto.Nombre = entidad.Nombre;
            dto.Descripcion = entidad.Descripcion;
            dto.Orden = entidad.Orden;
            dto.Estado = ConvertToDTO(entidad.Estado);
            dto.FechaSolicitud = entidad.FechaSolicitud;

            dto.Tarea = ConvertToDTO(entidad.Tarea);
            dto.FechaInicio = entidad.FechaInicio;
            dto.FechaFinEsperado = entidad.FechaFinEsperado;
            dto.FechaFinReal = entidad.FechaFinReal;
            dto.DuracionDias = entidad.DuracionDias;
            dto.PorcentajeAvance = entidad.PorcentajeAvance;
            dto.DesviadaMotivo = entidad.DesviadaMotivo;
            dto.EvaluacionCompleta = entidad.EvaluacionCompleta;
            dto.CumpleRequisitos = entidad.CumpleRequisitos();
            return dto;
        }

        public ProyectoTareaRequisitoDTO ConvertToDTO(TareaRequisito entidad)
        {
            if (entidad == null)
                return null;

            ProyectoTareaRequisitoDTO dto = new ProyectoTareaRequisitoDTO();
            dto.Codigo = entidad.ToString();
            dto.CodigoTarea = entidad.Tarea.Codigo;
            dto.CodigoNivelEspecialidad = entidad.NivelEspecialidad.Codigo;
            dto.NivelEspecialidad = entidad.NivelEspecialidad.Nombre;
            dto.Tarea = entidad.Tarea.Nombre;
            dto.Cantidad = entidad.Cantidad;
            dto.Asignados = entidad.Tarea.ListarAsignacion(entidad.NivelEspecialidad).Count;

            return dto;
        }

        public ProyectoTareaAsignacionDTO ConvertToDTO(Asignacion entidad)
        {
            if (entidad == null)
                return null;

            ProyectoTareaAsignacionDTO dto = new ProyectoTareaAsignacionDTO();
            dto.CodigoAsignacion = entidad.Codigo;
            dto.CodigoOperario = entidad.OperarioEspecialidad.Operario.ToString();
            dto.CodigoEspecialidad = entidad.OperarioEspecialidad.Especialidad.Codigo;
            dto.CodigoNivel = entidad.OperarioEspecialidad.NivelEspecialidad.Codigo;
            dto.Apellido = entidad.OperarioEspecialidad.Operario.Apellido;
            dto.Nombre = entidad.OperarioEspecialidad.Operario.Nombre;
            dto.Especialidad = entidad.OperarioEspecialidad.Especialidad.Nombre;
            dto.NivelEspecialidad = entidad.OperarioEspecialidad.NivelEspecialidad.Nombre;
            dto.FechaInicio = entidad.Tarea.FechaInicio;
            dto.FechaFin = entidad.Tarea.FechaFinEsperado;
            dto.FechaAsignacion = entidad.FechaAsignacion;
            dto.Puntaje = entidad.OperarioEspecialidad.Operario.CalcularEspecialidadPuntaje(entidad.OperarioEspecialidad);
            dto.Evaluado = entidad.Evaluacion != null;

            return dto;
        }

        #endregion

        #endregion

        #region Filtro

        public TFiltro ObtenerFiltro<TFiltro>() where TFiltro : IFiltro 
        {
            return ServiceLocator.Current.GetInstance<TFiltro>();
        }

        #endregion
    }
}
